iT邦幫忙

0

[Golang]同步工具-sync包的Wait、Signal、Broadcast方法說明-心智圖總結

  • 分享至 

  • xImage
  •  

1. 條件變數的Wait方法,做了什麼?
Wait方法的用途,為等待通知。
先看一下Wait方法的程式碼。

func (c *Cond) Wait() {
  c.checker.check()
  t := runtime_notifyListAdd(&c.notify)
  c.L.Unlock()
  runtime_notifyListWait(&c.notify, t)
  c.L.Lock()
}

A. 把調用它的goroutine(也就是當前的goroutine)加入到條件變數的通知隊列中。
B. 解鎖當前條件變數的那個互斥鎖。
C. 讓當前的goroutine處於等待狀態,等到通知到來時,再決定是否喚醒它。
此時,這個goroutine就會阻塞在呼叫Wait方法的那ㄧ行程式碼上。
D. 如果通知到來並且決定喚醒這個goroutine,那麼就會在喚醒它之後,重新鎖定當前條件變數的那個互斥鎖。
當前的goroutine繼續執行後面的程式碼。
總結Wait方法的流程是:加入到通知隊列 -> 解鎖L -> 等待通知 -> 鎖定L

E. Wait的簡易程式碼:
c.L.Lock()
for condition() {
c.Wait()
}
c.L.Unlock()

2. 條件變數的Signal方法與Broadcast方法,有哪些差異?
A. 這兩個方法都是用來發送通知。
B. Signal方法只會喚醒一個為此等待的goroutine,而Broadcast會喚醒鎖有為此等待的goroutine。
(Wait方法會把當前的goroutine添加到通知隊列的隊尾,而Signal方法會通知隊列的第一次)

C. 與Wait方法不同,條件變數的Signal和Broadcast方法,並不需要在互斥鎖的保護下執行。
D. 條件變數的通知有即時性。如果發送通知的時候,沒有goroutine為此等待,該通知就會被直接丟棄。

https://ithelp.ithome.com.tw/upload/images/20201123/20131728Z1owkaveAG.png

https://ithelp.ithome.com.tw/upload/images/20201123/20131728zF5WMMpfIS.png

參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言